package leetcode.数学;

/**
 * 螺旋矩阵II
 */
public class Test59螺旋矩阵II {

    public static int[][] generateMatrix(int n) {
        int[][] nums = new int[n][n];
        if (n == 0)
            return nums;
        int top = 0;
        int bottom = nums.length - 1;
        int left = 0;
        int right = nums[0].length - 1;
        int start = 1;
        while (true) {
            // 行不动，从左往右遍历列
            for (int i = left; i <= right; i++)
                nums[top][i] = start++;
            top++;// 顺时针转到下面
            if (left > right || top > bottom)
                break;

            // 列不动，往下遍历行
            for (int i = top; i <= bottom; i++)
                nums[i][right] = start++;
            right--;// 顺时针向左边转
            if (left > right || top > bottom)
                break;

            // 行不动，从右往左遍历列
            for (int i = right; i >= left; i--)
                nums[bottom][i] = start++;
            bottom--;// 顺时针往上走
            if (left > right || top > bottom)
                break;

            // 列不动，往上遍历
            for (int i = bottom; i >= top; i--)
                nums[i][left] = start++;
            left++; // 顺时针往右转
            if (left > right || top > bottom)
                break;
        }
        return nums;
    }

    public static void main(String[] args) {
        int n = 4;
//        int[][] ans = generateMatrix(n);
        int[][] ans = generateMatrix2(n);
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                System.out.print(ans[i][j] + " ");
            }
            System.out.println();
        }
    }

    public static int[][] generateMatrix2(int n) {
        int[][] nums = new int[n][n];
        if (n == 0)
            return nums;
        int layers = (n - 1) / 2 + 1;
        int count = 1;
        for (int i = 0; i < layers; i++) {
            // 从左到右
            for (int j = i; j < n - i; j++) {
                nums[i][j] = count++;
            }
            // 从右上到右下
            for (int j = i + 1; j < n - i; j++) {
                nums[j][n - 1 - i] = count++;
            }
            // 从右到左
            // 只有一层或者只有一列的时候，或者旋转到内层之后只有单独的一列或者一行的时候
            // 是不需要执行下面这两个for循环的，所以要检测一下：当前的行号（列号）是否等于层数
            for (int j = n - i - 2; j >= i ; j--) {
                nums[n - i - 1][j] = count++;
            }
            // 从左下到左上
            for (int j = n - i - 2; j > i ; j--) {
                nums[j][i] = count++;
            }
        }
        return nums;
    }
}
